package com.fth.learn.chapter05;

import java.util.Arrays;

/**
 * 练习
 * YiMi
 *
 * @author YiMi
 * @version 1.0
 * @date 2023/7/11 11:12
 */

public class LearnArray02 {
//        1: a:1 b:[1,2,3,4,5,6,7,8]
//            2: a:[1] b:[1,2,3,4,5,6,7,8]
//            3: a:[1,4] b:[1,2,3,4,5,6,7,8] 交集 全包含 不连续
//          4: a:[1,2,3,4] b:[2,3,4,5] 差集 以左面的为主 a为主 找a里面不在b里面的
//        5： a:{1,1,1,2,3,4,5,1,2,3,4,7,6}每一个元素出现的次数 （只出现一次 的数）

    public static  boolean  question01(int x,int[] arr){
                   //判断有无
        boolean ist = false;//假如
        /**
         * 1:对数组进行一个一个的查看 （循环）
         * 2.是否应该对取出来的每一个数进行比较
         * 3：把结果给ist
         */
        //证明
        for (int i = 0,max=arr.length;i<max;i++){
            if(arr[i] == x){
                ist = true;
                break;
            }
        }
        return ist;
    }


//    我做的
//    public static boolean question02(int[] x2,int[] arr){
//        boolean ist = false;
//        for (int i = 0,max=arr.length;i<max;i++){
//            if(arr[i] == x2[0]){
//                ist = true;
//                break;
//            }
//        }
//        return ist;
//    }

    //老师做的 (有bug版)
//    int[] sub = new int[] {1,2,3};
//    int[] target = new int[] {1,2,3,4,1,2,5,6};
//    /**
//     * 用来判断sub是否完全包含在target里面，如果存在返回true，反之false
//     * @param sub      子数组
//     * @param target    目标数组
//     * @return          是否存在
//     */
//    public static boolean question02(int[] sub, int[] target) {
//        boolean t = true;
//        /**
//         * 1 : 容错处理,判断一下target.length一定大于sub.length
//         * 1.1  初始位置 的判断
//         * 2 :  循环
//         */
//        if (target.length < sub.length) {
//            return false;
//        }
//
//        L:for (int i = 0; i < target.length; i++) {
//            //i = 3  target[3] == sub[0]
//            if (target[i] == sub[0]) {
//                for (int j = 1; j < sub.length; j++) {
//                    if (target[i + j] != sub[j]) {
//                        t=false;
//                        break L;
//                    }
//                }
//            }
//        }
//        return t;
//    }

    //老师做的 （正确版）
    public static boolean question02(int[] sub, int[] target) {
        /**
         * 1 : 容错处理,判断一下target.length一定大于sub.length
         * 1.1  初始位置 的判断
         * 2 :  循环
         */
        if (target.length < sub.length) {
            return false;
        }

        for (int i = 0; i < target.length; i++) {
            int num = 0;
            for (int j = 0; j < sub.length; j++) {
                //容错
                if(i + j < target.length){
                    //比较
                    if (sub[j] == target[i + j]) {
                        num++;
                    }
                }
            }
            //是否结束
            if(num == sub.length){
                return true;
            }
        }
        return false;
    }




//自己做的
//    public static boolean question03(int[] x3,int[] arr){
//        boolean ist = false;
//        for (int i = 0,max=arr.length;i<max;i++){
//            if(arr[i] == x3[0] && arr[i+1] == x3[1]){
//                ist = true;
//                break;
//            }
//        }
//        return ist;
//    }
    //自己做的
//        public static boolean question03(int[] x3,int[] arr){
//            boolean a = false;
//            boolean b = false;
//            for(int i = 0,max = arr.length;i<max;i++){
//                if(arr[i]==x3[0]){
//                    a=true;
//                }
//                if(arr[i]==x3[1]){
//                    b=true;
//                }
//            }
//            if(a && b){
//                return true;
//            }else{
//                return false;
//            }
//    }
    //自己做的
        public static boolean question03(int[] x3,int[] arr){
            int num = 0;
            L:for(int i = 0,max = x3.length;i<max;i++){
                for(int j = 0,max1 = arr.length;j<max1;j++){
                    if(x3[i]==arr[j]){
                        num++;
                        break L;
                    }
                }
            }
            if(num == x3.length){
                return true;
            }else {
                return false;
            }
        }

        //自己做的

        //4.1
    public static void question04(int[] x4, int[] x41){
        for(int i = 0,max = x4.length;i<max;i++){

            boolean n = false;
            for (int i1 = 0; i1 < x41.length; i1++) {
                if(x4[i] == x41[i1]){
                    n=true;
                    break;
                }
            }
            if(!n){
                System.out.println(x4[i]);
            }
        }
    }

    //4.2
    public static void question0402(int[] x4, int[] x41){
        for(int i = 0,max = x41.length;i<max;i++){

            boolean n = false;
            for (int i1 = 0; i1 < x4.length; i1++) {
                if(x41[i] == x4[i1]){
                    n=true;
                    break;
                }
            }
            if(!n){
                System.out.println(x41[i]);
            }
        }
    }

    //老师做的 4
//    /**
//     * 测试题
//     *
//     * @author kangjx
//     * @version 1.0
//     * @date 2023/7/12 上午10:13
//     */
//    public class Test01 {
//
//
//        //4 : a : [1，2,3,4] b : [2,3,4,5]  左差集 以左而的为主 a为主 找a里面不在b里面
//        //5 : a : {1,1,1,2,3,4,5,1,2,3,4,7,6} 每一个元素出现的次数 (只有一次的数)
//
//        /**
//         * 这个方法 用来求两个数的左差集
//         * 以左面的数组为主，右面的为从，求不同
//         *
//         * @param master 主数组
//         * @param slave  从数组
//         */
//        public static void question4_1(int[] master, int[] slave) {
//            //4 重复上面的操作
//            for (int x = 0; x < master.length; x++) {
//                //1 从主数组里拿到一个数
//                int temp = master[x];
//                //2 与从数组里面全部都比较一下
//                boolean ist = true;
//                for (int i = 0; i < slave.length; i++) {
//                    if (slave[i] == temp) {
//                        ist = false;
//                        break;
//                    }
//                }
//                //3 当所有的都不相同的时候这个就是我们要的差数
//                if (ist) {
//                    System.out.printf("这是一个差数%d", temp);
//                }
//            }
//        }
//
//        public static void question4_2(int[] slave,int[] master) {
//            question4_1(master,slave);
//        }
//
//        public static void question4_3(int[] master,int[] slave) {
//            question4_1(master,slave);
//            question4_1(slave,master);
//        }
//
//        public static void question5() {
//
//        }
//
//        public static void main(String[] args) {
////        int[] master = new int[3];
////        master[0] = 1;
////        master[1] = 2;
////        master[2] = 3;
////        int[] master = new int[]{1,2,3};
//            int[] master = {1, 2, 3, 5};
//            int[] slave = {2, 3, 4};
//            question4_1(master, slave);
//            System.out.println("--->");
//            question4_2(master, slave);
//        }
//
//    }




    //5.1
    public static void question05(int[] arr2){
        for (int j = 0; j < arr2.length - 1; j++) {
            for (int i = 0; i < arr2.length - 1 - j; i++) {
                if (arr2[i] > arr2[i + 1]) {
                    //swap
                    arr2[i] = arr2[i] + arr2[i + 1];
                    arr2[i + 1] = arr2[i] - arr2[i + 1];
                    arr2[i] = arr2[i] - arr2[i + 1];
                }
            }
        }
        System.out.print(Arrays.toString(arr2));

        int num;
        for(int a=0;a<arr2.length;a++){
            for(int b=0;b< arr2.length;b++){
                if(a>b){
                    break;
                }
                if(b==arr2.length){
                    num=arr2.length-a;
                    System.out.println(arr2[a] + "的个数是" + num);
                    return;
                }
                if(arr2[a] != arr2[b]){
                    num=b-a;
                    System.out.println(arr2[a] + "的个数是" + num);
                    a=b;
                }
            }
        }
    }

    //5.2
    public static void question0502(int[] arr2){
        for (int j = 0; j < arr2.length - 1; j++) {
            for (int i = 0; i < arr2.length - 1 - j; i++) {
                if (arr2[i] > arr2[i + 1]) {
                    //swap
                    arr2[i] = arr2[i] + arr2[i + 1];
                    arr2[i + 1] = arr2[i] - arr2[i + 1];
                    arr2[i] = arr2[i] - arr2[i + 1];
                }
            }
        }
        System.out.print(Arrays.toString(arr2));

        int num;
        for(int a=0;a<arr2.length;a++){
            for(int b=0;b< arr2.length+1;b++){
                if(a>b){
                    break;
                }
                if(b==arr2.length){
                    num=arr2.length-a;
                    if(num==1){
                        System.out.println("一个数的是"+arr2[a]);
                    }
                    return;
                }
                if(arr2[a] != arr2[b]){
                    num=b-a;
                    if(num==1){
                        System.out.println("一个数的是"+arr2[a]);
                    }
                    a=b;
                }
            }
        }
    }

//老师写的 5

//    /**
//     * 测试题
//     *
//     * @author kangjx
//     * @version 1.0
//     * @date 2023/7/12 上午10:13
//     */
//    public class Test01 {
//        //4 : a : [1，2,3,4] b : [2,3,4,5]  左差集 以左而的为主 a为主 找a里面不在b里面
//
//
//        //5 : a : {1,1,1,2,3,4,5,1,2,3,4,7,6} 每一个元素出现的次数 (只有一次的数)
//
////            0 1 2 3 4 5 6
//        //桶 ： [1][][][][8][][]
//
////    {1,1,1,1,2,2,3,3,4,4,5,6,7}
//
////    1: 想办法 让无序变有序  ()。。。
////     1 ！1
//
//
//        /**
//         * 这个方法 用来求两个数的左差集
//         * 以左面的数组为主，右面的为从，求不同
//         *
//         * @param master 主数组
//         * @param slave  从数组
//         */
//        public static void question4_1(int[] master, int[] slave) {
//            //4 重复上面的操作
//            for (int x = 0; x < master.length; x++) {
//                //1 从主数组里拿到一个数
//                int temp = master[x];
//                //2 与从数组里面全部都比较一下
//                boolean ist = true;
//                for (int i = 0; i < slave.length; i++) {
//                    if (slave[i] == temp) {
//                        ist = false;
//                        break;
//                    }
//                }
//                //3 当所有的都不相同的时候这个就是我们要的差数
//                if (ist) {
//                    System.out.printf("这是一个差数%d", temp);
//                }
//            }
//        }
//
//        public static void question4_2(int[] slave, int[] master) {
//            question4_1(master, slave);
//        }
//
//        public static void question4_3(int[] master, int[] slave) {
//            question4_1(master, slave);
//            question4_1(slave, master);
//        }
//
    //老师写的有错的  练习断点
////    public static void question5(int[] array) {
////        //1 : 先排序
////        Arrays.sort(array);
////        //2 : 先来一次输出
////        System.out.println(Arrays.toString(array));
////
////        //3。 先拿到第一个
////        for (int i = 0; i < array.length; i++) {
////            int num = 0;
////            for(int j = i;j < array.length;j++){
////                if(array[i] != array[j]){
////                    num = j;
////                    break;
////                }
////            }
////
////               System.out.printf("当前数组里的%d,有多少%d个\n",array[i],num == 0 ? 1 : num-i);
////            i = (num == 0) ? i : num-1;
////        }
////
////    }
//
//        public static void question5(int[] array) {
//            //1 : 先排序
//            Arrays.sort(array);
//            //2 : 先来一次输出
//            System.out.println(Arrays.toString(array));
//
//            //3。 先拿到第一个
//            for (int i = 0; i < array.length; i++) {
//                int num = 0;
//                for (int j = i; j < array.length; j++) {
//                    if (array[i] != array[j]) {
//                        num = j;
//                        break;
//                    }
//                }
//
//                System.out.printf("当前数组里的%d,有多少%d个\n", array[i], num == 0 ? array.length - i : num - i);
//                i = (num == 0) ? array.length - 1 : num - 1;
//            }
//
//        }
//
//        public static void main(String[] args) {
////        int[] master = new int[3];
////        master[0] = 1;
////        master[1] = 2;
////        master[2] = 3;
////        int[] master = new int[]{1,2,3};
//
//            int[] arr = {11,11,11,2,3,4,5,11,11,2,3,4,7,6};
//            question5(arr);
//        }
//
//    }


    public static void main(String[] args) {
        int x=3;
        int[] arr = new int[] {1,3,4,5,16};
        int[] x2 = new int[] {1};
        int[] x3 = new int[] {1,4};
        int[] x4 = new int[] {2,4,5,6};
        int[] x41 = new int[] {1,2,3,4};
        int[] arr2 = new int[] {1,2,3,4,5,1,2,3,3,6,8,9};
        int[] sub = new int[] {1,2,3};
        int[] target = new int[] {1,2,3,4,1,2,5,6};


//        arr[0] = 3;
//        arr[1] = 4;
//        arr[2] = 6;
//        arr[3] = 16;
        System.out.println(question01(x,arr));
        System.out.println(question02(sub,target));
        System.out.println(question03(x3,arr));
        question04(x4,x41);
        question0402(x4,x41);

        question05(arr2);
        question0502(arr2);


    }
}
